IC存储实验—StableMemory与运行时WASM存储对比
简介
Motoko编程语言是一种新型的,现代的编程语言,专为希望构建下一代可直接在互联网上运行的应用和服务的开发人员而设计。Motoko语言针对互联网计算机(IC)的创作进行了优化,并且还附带了很多熟悉的功能,例如:异步/异步等待(async/await),随机(randomness), 时间(time),日期(date)和浮点数。这些能力让你感受不到你是在新型区块链上开发应用。
Motoko提供互联网计算机软件Canister的原生支持,这些Canister用actors表示成独立对象,可以封装其状态并通过异步消息进行通信。Canister的总体内存包含Wasm run time和Stable memory,对一个Canister而言, Wasm为4G,后者为8G。本期将通过实验对StableMemory与运行时WASM存储进行对比并依据实验结果提出项目内存使用意见。
说明
数据:
300 个 1.5 M(1.5*1024*1024)字节的blob,以
K : Text, V : Blob
的形式传给canister,canister分别用stable memory和wasm memory进⾏存储
GC:
两个canister均使用 Coping GC
Canister Type:
⼀个Canister使用StableMemory存储,另⼀个使运运行时Wasm存储
子网环境:
实验时间:
2022 / 04 / 09 21:20
Stable Memory canister:
canister id :magsy-yyaaa-aaaap-aaaea-cai
所在子网:3hhby-wmtmw-umt4t-7ieyg-bbiig-xiylg-sblrt-voxgt-bqckd-a75bf-rqe
实验前后子网状态(箭头所指为实验时子网的波澜)
Non Stable Memory Canister所在子网:
canister id :q63io-vqaaa-aaaam-aabaa-cai
所在子网:4ecnw-byqwz-dtgss-ua2mh-pfvs7-c3lct-gtf4e-hnu75-j7eek-iifqm-sqe
实验前后⼦⽹状态(箭头所指为实验时子网的波澜)
实验结果
使用Wasm运行时内存存储:
初始状态:
start status : Status { cycle_balance: 7280897243379, stable_memory: 0, wasm_memory: 2293760, time: 1649509638007110607, during: 0 }
最后状态:
end status : Status { cycle_balance: 6650654854172, stable_memory: 0, wasm_memory: 665190400, time: 1649511192443144859, during: 0 }
数据统计:
Cycle 消耗:0.630242389207 T (630242389207)
stable memory变化:0
wasm memory变化:632.1875 M (662896640 byte)
存储共耗时:1554.436034252 s
平均存储时间:5.181453447506667
P.S. 平均存储时间:此时间并非存储所用时间,而是统计的平均往返耗时:往返路由时间+共识+执行+其他消耗, 因此此存储数据并非精确存储所花费的时间,只具有宏观统计的直观意义。
使用Stable Memory存储:
初始状态:
start status : Status { cycle_balance: 5582455863356, stable_memory: 1114112, wasm_memory: 2293760, time: 1649511198872045920, during: 0 }
最后状态:
end status : Status { cycle_balance: 4954035934520, stable_memory: 314638336, wasm_memory: 2359296, time: 1649512774949831717, during: 0 }
数据统计:
Cycle 消耗:0.628419928836 T (628419928836)
stable memory变化:299.0 M (因为之前已经用stable memory存储过内容)wasm memory变化:16 KB (65536 byte)
存储共耗时:1576.077785797 s
平均存储时间:5.253592619323333
实验结论
由于StableMemory不参与运行时内存使用, 因此不统计说明StableMemory对运行时的影响。
StableMemory存储相⽐Wasm运⾏时内存存储:
Cycle消耗:
Cycle消耗相差不多,本实验中相差0.01 T
Wasm Memory变化:
使⽤StableMemory存储,运行时内存增加16Kb;使用非StableMemory内存存储数据,wasm运⾏时内 存增加632MB。因此,之前使用stable memory内存存储时担忧的同⼀份数据会先经过wasm运行时内存,后存入stable memory,从⽽导致的同⼀份数据存储两次,从⽽造成大量额外内存开销的情况并没有出现。猜想的原因为:通过copying gc的优化,在stable memory存储的canister会及时清除运行时的垃圾数据,从而减少不必要的运行时内存开销。
存储耗时:
对 450 M数据存储的时间而言,使用stable memory存储的时间比非stable memory存储的时间多了22 s(⼀次数据,不具有统计意义,由于状态机特性,我们可以认为比较结果可以信任)。因此,stable memory会在存储时花费更多的时间,主要原因为数据从函数⼊⼝到wasm运行时,再到stable memory存储,从wasm -> stable需要调⽤ic0底层接口,有额外的调⽤开销。因此,使用stable memory在存储时间上会更多。
平均存储耗时:
300次存储数据,stable memory存储⽐wasm运行时存储平均多0.07 s
对项目的内存使用意见
对于⼀次存多次取的场景下, 可以在产品上线前将数据存⼊stable memory,不必担心运行时会多很大的开销,cycle消耗也不会有很大差距。但是在运行时:stable memory存储的表现远强于wasm memory存储,不会出现由于wasm heap过大导致的cansiter无法对外正常提供服务或者服务过慢。对有大量数据存储需求的项目可以使用stable memory存储。
欢迎关注PrimLabs-Z时代的干货实验室!